{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "GbcRkbN1c76s"
   },
   "source": [
    "# 示例文档"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-10-29T01:48:16.792854Z",
     "iopub.status.busy": "2024-10-29T01:48:16.792408Z",
     "iopub.status.idle": "2024-10-29T01:48:19.575096Z",
     "shell.execute_reply": "2024-10-29T01:48:19.574498Z",
     "shell.execute_reply.started": "2024-10-29T01:48:16.792835Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://mirrors.cloud.aliyuncs.com/pypi/simple\n",
      "Collecting torchsummary\n",
      "  Downloading https://mirrors.cloud.aliyuncs.com/pypi/packages/7d/18/1474d06f721b86e6a9b9d7392ad68bed711a02f3b61ac43f13c719db50a6/torchsummary-1.5.1-py3-none-any.whl (2.8 kB)\n",
      "Installing collected packages: torchsummary\n",
      "Successfully installed torchsummary-1.5.1\n",
      "\u001B[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001B[0m\u001B[33m\n",
      "\u001B[0m\n",
      "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m A new release of pip is available: \u001B[0m\u001B[31;49m24.0\u001B[0m\u001B[39;49m -> \u001B[0m\u001B[32;49m24.3\u001B[0m\n",
      "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m To update, run: \u001B[0m\u001B[32;49mpython -m pip install --upgrade pip\u001B[0m\n"
     ]
    }
   ],
   "source": [
    "!pip install torchsummary"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-10-29T01:46:53.491746Z",
     "iopub.status.busy": "2024-10-29T01:46:53.491471Z",
     "iopub.status.idle": "2024-10-29T01:46:53.496970Z",
     "shell.execute_reply": "2024-10-29T01:46:53.496518Z",
     "shell.execute_reply.started": "2024-10-29T01:46:53.491728Z"
    },
    "id": "n9FXEF0d2NE9",
    "tags": []
   },
   "outputs": [],
   "source": [
    "docs = ['cat chases mice',\n",
    "        'cat catches mice',\n",
    "        'cat eats mice',\n",
    "        'mice runs into hole',\n",
    "        'cat says bad words',\n",
    "        'cat and mice are pals',\n",
    "        'cat and mice are chums',\n",
    "        'mice stores food in hole',\n",
    "        'cat stores food in house',\n",
    "        'mice sleeps in hole',\n",
    "        'cat sleeps in house',\n",
    "        'cat and mice are buddies',\n",
    "        'mice lives in hole',\n",
    "        'cat lives in house']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练Embedding之前"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2024-10-29T02:04:28.442712Z",
     "iopub.status.busy": "2024-10-29T02:04:28.442216Z",
     "iopub.status.idle": "2024-10-29T02:04:28.678970Z",
     "shell.execute_reply": "2024-10-29T02:04:28.678460Z",
     "shell.execute_reply.started": "2024-10-29T02:04:28.442690Z"
    },
    "tags": [],
    "jupyter": {
     "is_executing": true
    }
   },
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.decomposition import PCA\n",
    "\n",
    "# 单词列表\n",
    "docs = ['cat', 'and', 'mice', 'are', 'buddies', 'hole', 'lives', 'in',\n",
    "        'house', 'chases', 'catches', 'runs', 'into', 'says', 'bad',\n",
    "        'words', 'pals', 'chums', 'stores', 'sleeps']\n",
    "\n",
    "# 为每个单词生成随机向量（例如，10维）\n",
    "np.random.seed(42)  # 为了可重复性\n",
    "random_embeddings = np.random.rand(len(docs), 10)\n",
    "\n",
    "# 执行PCA以将维度减少到2D以便可视化\n",
    "pca = PCA(n_components=2)\n",
    "reduced_embeddings = pca.fit_transform(random_embeddings)\n",
    "\n",
    "# 绘制二维嵌入\n",
    "plt.figure(figsize=(10, 8))\n",
    "for i, word in enumerate(docs):\n",
    "    plt.scatter(reduced_embeddings[i, 0], reduced_embeddings[i, 1], marker='o')\n",
    "    plt.text(reduced_embeddings[i, 0] + 0.01, reduced_embeddings[i, 1] + 0.01, word, fontsize=12)\n",
    "\n",
    "plt.title(\"随机词向量的二维可视化\")\n",
    "plt.xlabel(\"主成分 1\")\n",
    "plt.ylabel(\"主成分 2\")\n",
    "plt.grid(True)\n",
    "plt.show()"
   ],
   "outputs": [],
   "execution_count": null
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "y3r98mUS3Zcv"
   },
   "source": [
    "# 创建数据库然后标记数字"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2024-10-29T01:46:56.494696Z",
     "iopub.status.busy": "2024-10-29T01:46:56.494411Z",
     "iopub.status.idle": "2024-10-29T01:46:56.498574Z",
     "shell.execute_reply": "2024-10-29T01:46:56.498170Z",
     "shell.execute_reply.started": "2024-10-29T01:46:56.494679Z"
    },
    "id": "7i0v00vz3K-5",
    "outputId": "137b7c7b-9c61-48d0-d341-2c74e4070629",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "idx_2_word\n",
      "{1: 'cat', 2: 'chases', 3: 'mice', 4: 'catches', 5: 'eats', 6: 'runs', 7: 'into', 8: 'hole', 9: 'says', 10: 'bad', 11: 'words', 12: 'and', 13: 'are', 14: 'pals', 15: 'chums', 16: 'stores', 17: 'food', 18: 'in', 19: 'house', 20: 'sleeps', 21: 'buddies', 22: 'lives'}\n",
      "word_2_idx\n",
      "{'cat': 1, 'chases': 2, 'mice': 3, 'catches': 4, 'eats': 5, 'runs': 6, 'into': 7, 'hole': 8, 'says': 9, 'bad': 10, 'words': 11, 'and': 12, 'are': 13, 'pals': 14, 'chums': 15, 'stores': 16, 'food': 17, 'in': 18, 'house': 19, 'sleeps': 20, 'buddies': 21, 'lives': 22}\n",
      "22\n"
     ]
    }
   ],
   "source": [
    "idx_2_word = {}\n",
    "word_2_idx = {}\n",
    "temp = []\n",
    "i = 1\n",
    "for doc in docs:\n",
    "  for word in doc.split():\n",
    "    if word not in temp:\n",
    "      temp.append(word)\n",
    "      idx_2_word[i] = word\n",
    "      word_2_idx[word] = i\n",
    "      i += 1\n",
    "\n",
    "print(\"idx_2_word\")\n",
    "print(idx_2_word)\n",
    "\n",
    "print(\"word_2_idx\")\n",
    "print(word_2_idx)\n",
    "\n",
    "print(len(temp))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2024-10-29T01:46:59.960737Z",
     "iopub.status.busy": "2024-10-29T01:46:59.960468Z",
     "iopub.status.idle": "2024-10-29T01:46:59.964108Z",
     "shell.execute_reply": "2024-10-29T01:46:59.963697Z",
     "shell.execute_reply.started": "2024-10-29T01:46:59.960720Z"
    },
    "id": "jYqiNTXo3gDj",
    "outputId": "fce4f263-775f-4e59-fc9b-15bc3dcff470",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1, 2, 3], [1, 4, 3], [1, 5, 3], [3, 6, 7, 8], [1, 9, 10, 11], [1, 12, 3, 13, 14], [1, 12, 3, 13, 15], [3, 16, 17, 18, 8], [1, 16, 17, 18, 19], [3, 20, 18, 8], [1, 20, 18, 19], [1, 12, 3, 13, 21], [3, 22, 18, 8], [1, 22, 18, 19]]\n"
     ]
    }
   ],
   "source": [
    "vocab_size = 25\n",
    "\n",
    "def one_hot_map(doc):\n",
    "  x = []\n",
    "  for word in doc.split():\n",
    "    x.append(word_2_idx[word])\n",
    "  return x\n",
    "\n",
    "encoded_docs = [one_hot_map(d) for d in docs]\n",
    "print(encoded_docs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Cd9ye9hj3niB"
   },
   "source": [
    "# 后期处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2024-10-29T01:47:03.414316Z",
     "iopub.status.busy": "2024-10-29T01:47:03.414025Z",
     "iopub.status.idle": "2024-10-29T01:47:10.827864Z",
     "shell.execute_reply": "2024-10-29T01:47:10.827398Z",
     "shell.execute_reply.started": "2024-10-29T01:47:03.414299Z"
    },
    "id": "KxB1hzd53i6-",
    "outputId": "a24c0cc7-682b-4770-cf88-5ad28c042ba3",
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2024-10-29 09:47:04.098527: I tensorflow/core/util/port.cc:111] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n",
      "2024-10-29 09:47:04.623642: E tensorflow/compiler/xla/stream_executor/cuda/cuda_dnn.cc:9342] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n",
      "2024-10-29 09:47:04.623667: E tensorflow/compiler/xla/stream_executor/cuda/cuda_fft.cc:609] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n",
      "2024-10-29 09:47:04.627316: E tensorflow/compiler/xla/stream_executor/cuda/cuda_blas.cc:1518] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n",
      "2024-10-29 09:47:04.885723: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
      "To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n",
      "2024-10-29 09:47:07.216676: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[ 1,  2,  3,  0,  0,  0,  0,  0,  0,  0],\n",
       "       [ 1,  4,  3,  0,  0,  0,  0,  0,  0,  0],\n",
       "       [ 1,  5,  3,  0,  0,  0,  0,  0,  0,  0],\n",
       "       [ 3,  6,  7,  8,  0,  0,  0,  0,  0,  0],\n",
       "       [ 1,  9, 10, 11,  0,  0,  0,  0,  0,  0],\n",
       "       [ 1, 12,  3, 13, 14,  0,  0,  0,  0,  0],\n",
       "       [ 1, 12,  3, 13, 15,  0,  0,  0,  0,  0],\n",
       "       [ 3, 16, 17, 18,  8,  0,  0,  0,  0,  0],\n",
       "       [ 1, 16, 17, 18, 19,  0,  0,  0,  0,  0],\n",
       "       [ 3, 20, 18,  8,  0,  0,  0,  0,  0,  0],\n",
       "       [ 1, 20, 18, 19,  0,  0,  0,  0,  0,  0],\n",
       "       [ 1, 12,  3, 13, 21,  0,  0,  0,  0,  0],\n",
       "       [ 3, 22, 18,  8,  0,  0,  0,  0,  0,  0],\n",
       "       [ 1, 22, 18, 19,  0,  0,  0,  0,  0,  0]], dtype=int32)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from tensorflow.keras.preprocessing.sequence import pad_sequences\n",
    "\n",
    "max_len = 10\n",
    "padded_docs = pad_sequences(encoded_docs, maxlen=max_len, padding='post')\n",
    "padded_docs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "dPkynWPz5UJj"
   },
   "source": [
    "# 训练数据集准备"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2024-10-29T01:47:15.112319Z",
     "iopub.status.busy": "2024-10-29T01:47:15.111708Z",
     "iopub.status.idle": "2024-10-29T01:47:15.120121Z",
     "shell.execute_reply": "2024-10-29T01:47:15.119592Z",
     "shell.execute_reply.started": "2024-10-29T01:47:15.112297Z"
    },
    "id": "N5tm_vhT5L3b",
    "outputId": "07a5062f-b655-493e-9ac8-1b446948472d",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "148\n",
      "(148, 2)\n",
      "[[1. 2.]\n",
      " [1. 3.]\n",
      " [2. 1.]\n",
      " [2. 3.]\n",
      " [3. 1.]\n",
      " [3. 2.]\n",
      " [1. 4.]\n",
      " [1. 3.]\n",
      " [4. 1.]\n",
      " [4. 3.]\n",
      " [3. 1.]\n",
      " [3. 4.]\n",
      " [1. 5.]\n",
      " [1. 3.]\n",
      " [5. 1.]\n",
      " [5. 3.]\n",
      " [3. 1.]\n",
      " [3. 5.]\n",
      " [3. 6.]\n",
      " [3. 7.]\n",
      " [6. 3.]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "training_data = np.empty((0,2))\n",
    "\n",
    "window = 2\n",
    "for sentence in padded_docs:\n",
    "  sent_len = len(sentence)\n",
    "  for i, word in enumerate(sentence):\n",
    "    w_context = []\n",
    "    if sentence[i] != 0:\n",
    "      w_target = sentence[i]\n",
    "      for j in range(i-window, i + window + 1):\n",
    "        if j != i and j <= sent_len -1 and j >=0 and sentence[j]!=0:\n",
    "          w_context = sentence[j]\n",
    "          training_data = np.append(training_data, [[w_target, w_context]], axis=0)\n",
    "          #training_data.append([w_target, w_context])\n",
    "\n",
    "print(len(training_data))\n",
    "print(training_data.shape)\n",
    "print(training_data[0:21])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "8GytGTXH5df5"
   },
   "source": [
    "# 编码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2024-10-29T01:47:18.399709Z",
     "iopub.status.busy": "2024-10-29T01:47:18.399417Z",
     "iopub.status.idle": "2024-10-29T01:47:19.113260Z",
     "shell.execute_reply": "2024-10-29T01:47:19.112793Z",
     "shell.execute_reply.started": "2024-10-29T01:47:18.399691Z"
    },
    "id": "dsz8vSIs5lDd",
    "outputId": "ab309f69-c232-4145-df47-ac1699d5b3d5",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "onehot_label_x\n",
      "[[0. 1. 0. ... 0. 0. 0.]\n",
      " [0. 1. 0. ... 0. 0. 0.]\n",
      " [0. 0. 1. ... 0. 0. 0.]\n",
      " ...\n",
      " [0. 0. 0. ... 0. 0. 0.]\n",
      " [0. 0. 0. ... 0. 0. 0.]\n",
      " [0. 0. 0. ... 0. 0. 0.]]\n",
      "onehot_label_y\n",
      "[[0. 0. 1. ... 0. 0. 0.]\n",
      " [0. 0. 0. ... 0. 0. 0.]\n",
      " [0. 1. 0. ... 0. 0. 0.]\n",
      " ...\n",
      " [0. 0. 0. ... 0. 0. 0.]\n",
      " [0. 0. 0. ... 0. 0. 0.]\n",
      " [0. 0. 0. ... 0. 0. 0.]]\n",
      "<class 'numpy.ndarray'>\n"
     ]
    }
   ],
   "source": [
    "from sklearn.preprocessing import OneHotEncoder\n",
    "\n",
    "enc = OneHotEncoder()\n",
    "enc.fit(np.array(range(30)).reshape(-1,1))\n",
    "onehot_label_x = enc.transform(training_data[:,0].reshape(-1,1)).toarray()\n",
    "\n",
    "print(\"onehot_label_x\")\n",
    "print(onehot_label_x)\n",
    "\n",
    "enc = OneHotEncoder()\n",
    "enc.fit(np.array(range(30)).reshape(-1,1))\n",
    "onehot_label_y = enc.transform(training_data[:,1].reshape(-1,1)).toarray()\n",
    "\n",
    "print(\"onehot_label_y\")\n",
    "print(onehot_label_y)\n",
    "\n",
    "print(type(onehot_label_x))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "43aQ5KTo6PU-"
   },
   "source": [
    "# 设置一个随意的模型进行训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2024-10-29T02:07:05.788032Z",
     "iopub.status.busy": "2024-10-29T02:07:05.787696Z",
     "iopub.status.idle": "2024-10-29T02:07:05.794492Z",
     "shell.execute_reply": "2024-10-29T02:07:05.794054Z",
     "shell.execute_reply.started": "2024-10-29T02:07:05.788013Z"
    },
    "id": "L_ipql3O6VwV",
    "outputId": "cffe6382-9ea4-4971-c4e2-90b109c0aace",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WEMB(\n",
      "  (softmax): Softmax(dim=1)\n",
      "  (l1): Linear(in_features=30, out_features=2, bias=False)\n",
      "  (l2): Linear(in_features=2, out_features=30, bias=False)\n",
      ")\n"
     ]
    }
   ],
   "source": [
    "# Hyperparameters\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "from torchsummary import summary\n",
    "\n",
    "\n",
    "input_size = 30\n",
    "hidden_size = 2\n",
    "learning_rate = 0.01\n",
    "num_epochs = 1000\n",
    "\n",
    "class WEMB(nn.Module):\n",
    "  def __init__(self, input_size, hidden_size):\n",
    "    super(WEMB, self).__init__()\n",
    "    self.input_size = input_size\n",
    "    self.hidden_size = hidden_size\n",
    "    self.softmax = nn.Softmax(dim=1)\n",
    "\n",
    "    self.l1 = nn.Linear(self.input_size, self.hidden_size, bias=False)\n",
    "    self.l2 = nn.Linear(self.hidden_size, self.input_size, bias=False)\n",
    "\n",
    "  def forward(self, x):\n",
    "    out_bn = self.l1(x) # bn - bottle_neck\n",
    "    out = self.l2(out_bn)\n",
    "    out = self.softmax(out)\n",
    "    return out, out_bn\n",
    "\n",
    "device = torch.device('cpu')\n",
    "\n",
    "model = WEMB(input_size, hidden_size).to(device)\n",
    "model.train(True)\n",
    "print(model)\n",
    "\n",
    "# 损失和优化器设置\n",
    "criterion = nn.BCELoss()\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, \\\n",
    "                            momentum=0, weight_decay=0, nesterov=False)\n",
    "# summary(model, torch.ones((1,30)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000
    },
    "execution": {
     "iopub.execute_input": "2024-10-29T02:07:10.695210Z",
     "iopub.status.busy": "2024-10-29T02:07:10.694915Z",
     "iopub.status.idle": "2024-10-29T02:07:50.548827Z",
     "shell.execute_reply": "2024-10-29T02:07:50.548343Z",
     "shell.execute_reply.started": "2024-10-29T02:07:10.695193Z"
    },
    "id": "8FPaFt2n7NT5",
    "outputId": "f2783f11-42f3-4d53-b148-6cf663111f35",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch [100/1000], Loss: 0.1436\n",
      "Epoch [200/1000], Loss: 0.1424\n",
      "Epoch [300/1000], Loss: 0.1408\n",
      "Epoch [400/1000], Loss: 0.1385\n",
      "Epoch [500/1000], Loss: 0.1353\n",
      "Epoch [600/1000], Loss: 0.1309\n",
      "Epoch [700/1000], Loss: 0.1253\n",
      "Epoch [800/1000], Loss: 0.1183\n",
      "Epoch [900/1000], Loss: 0.1103\n",
      "Epoch [1000/1000], Loss: 0.1019\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f5c387c0e10>]"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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MFBOTk4nraTIy8tTSEiISalapylTpujLL7/UkiVLFBYWVnd/SEiIKisrdezYsXrH/3qMQ0JCTvnf4OfHUHvKJz8/X4MHD5azs7OcnZ21bNkyvfDCC3J2dlZwcDDj3EQ6duyoPn361Luvd+/eysrKkvTLWJ3p742QkBDl5+fXe7y6ulpHjhxhrE946KGHNH36dN18883q37+/brvtNj3wwANKTk6WxDg3l6Ya1+b6+4TCchqurq6KiYlRSkpK3X02m00pKSmKj483MVnrYRiGpkyZogULFmjx4sUnfUUYExMjFxeXemOcmZmprKysujGOj4/X5s2b6/0BWbRokXx8fE764GirLr/8cm3evFlpaWl1t9jYWI0fP77u14xz0xg2bNhJS/O3b9+uzp07S5K6dOmikJCQemNdVFSk1atX1xvrY8eOKTU1te6YxYsXy2azKS4urgXehf0rKyuT1Vr/48nJyUk2m00S49xcmmpc4+PjtXz5clVVVdUds2jRIvXs2bPRp4Mksaz5TObNm2e4ubkZb731lrF161bj7rvvNvz8/OqtpMDp3XfffYavr6+xdOlS4+DBg3W3srKyumPuvfdeIyIiwli8eLGxbt06Iz4+3oiPj697/OfltldeeaWRlpZmLFy40OjQoQPLbc/i16uEDINxbipr1qwxnJ2djSeffNLYsWOH8d577xkeHh7Gu+++W3fMzJkzDT8/P+Pzzz83Nm3aZIwePfqUy0IHDRpkrF692vjxxx+N7t27t/nltr82ceJEo1OnTnXLmj/99FMjMDDQ+Otf/1p3DOPcOMXFxcaGDRuMDRs2GJKM5557ztiwYYOxb98+wzCaZlyPHTtmBAcHG7fddpuxZcsWY968eYaHhwfLmpvbiy++aERERBiurq7G0KFDjVWrVpkdqdWQdMrbm2++WXfM8ePHjT/96U9G+/btDQ8PD+O6664zDh48WO919u7da1x11VVGu3btjMDAQOPBBx80qqqqWvjdtC6/LSyMc9P54osvjH79+hlubm5Gr169jNdee63e4zabzXj00UeN4OBgw83Nzbj88suNzMzMesccPnzYuOWWWwwvLy/Dx8fHmDRpklFcXNySb8OuFRUVGffff78RERFhuLu7G127djUeeeSRestkGefGWbJkySn/Xp44caJhGE03rhs3bjQuuugiw83NzejUqZMxc+bM885uMYxfbR0IAABgh5jDAgAA7B6FBQAA2D0KCwAAsHsUFgAAYPcoLAAAwO5RWAAAgN2jsAAAALtHYQEAAHaPwgIAAOwehQUAANg9CgsAALB7FBYAAGD3/j+AK8OtEYQldAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import torch\n",
    "loss_val = []\n",
    "\n",
    "onehot_label_x=torch.Tensor(onehot_label_x)\n",
    "onehot_label_y=torch.Tensor(onehot_label_y)\n",
    "onehot_label_x = onehot_label_x.to(device)\n",
    "onehot_label_y = onehot_label_y.to(device)\n",
    "\n",
    "for epoch in range(num_epochs):\n",
    "  for i in range(onehot_label_y.shape[0]):\n",
    "      inputs = onehot_label_x[i].float()\n",
    "      labels = onehot_label_y[i].float()\n",
    "      inputs = inputs.unsqueeze(0)\n",
    "      labels = labels.unsqueeze(0)\n",
    "\n",
    "      # 模型预测\n",
    "      output, wemb = model(inputs)\n",
    "      loss = criterion(output, labels)\n",
    "\n",
    "      # 反向传播\n",
    "      optimizer.zero_grad()\n",
    "      loss.backward()\n",
    "      optimizer.step()\n",
    "  loss_val.append(loss.item())\n",
    "\n",
    "  if (epoch+1) % 100 == 0:\n",
    "    print (f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')\n",
    "\n",
    "plt.plot(loss_val)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "tZI9dzUI3eed"
   },
   "source": [
    "# 生成embedding"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2024-10-29T02:13:03.829569Z",
     "iopub.status.busy": "2024-10-29T02:13:03.829117Z",
     "iopub.status.idle": "2024-10-29T02:13:03.837030Z",
     "shell.execute_reply": "2024-10-29T02:13:03.836578Z",
     "shell.execute_reply.started": "2024-10-29T02:13:03.829550Z"
    },
    "id": "Lku7yRXP3g7E",
    "outputId": "6006e42e-e5b4-48ba-ef15-f80defc27d50",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "单词 - cat - Embedding嵌入是 0.55 & 0.55\n",
      "单词 - and - Embedding嵌入是 0.057 & 0.057\n",
      "单词 - mice - Embedding嵌入是 0.964 & 0.964\n",
      "单词 - are - Embedding嵌入是 0.112 & 0.112\n",
      "单词 - buddies - Embedding嵌入是 0.181 & 0.181\n",
      "单词 - hole - Embedding嵌入是 0.623 & 0.623\n",
      "单词 - lives - Embedding嵌入是 -0.163 & -0.163\n",
      "单词 - in - Embedding嵌入是 -0.154 & -0.154\n",
      "单词 - house - Embedding嵌入是 0.14 & 0.14\n",
      "单词 - chases - Embedding嵌入是 0.466 & 0.466\n",
      "单词 - catches - Embedding嵌入是 0.00779 & 0.00779\n",
      "单词 - runs - Embedding嵌入是 0.479 & 0.479\n",
      "单词 - into - Embedding嵌入是 0.111 & 0.111\n",
      "单词 - says - Embedding嵌入是 0.191 & 0.191\n",
      "单词 - bad - Embedding嵌入是 0.712 & 0.712\n",
      "单词 - words - Embedding嵌入是 0.534 & 0.534\n",
      "单词 - pals - Embedding嵌入是 0.367 & 0.367\n",
      "单词 - chums - Embedding嵌入是 0.894 & 0.894\n",
      "单词 - stores - Embedding嵌入是 0.545 & 0.545\n",
      "单词 - sleeps - Embedding嵌入是 0.67 & 0.67\n"
     ]
    }
   ],
   "source": [
    "# 传递所有训练数据并获得第二个输出\n",
    "docs = ['cat and mice are buddies hole lives in house chases catches runs into says bad words pals chums stores sleeps']\n",
    "encoded_docs = [one_hot_map(d) for d in docs]\n",
    "\n",
    "test_arr = np.array([[ 1.,  2., 3., 4., 5., 8., 6., 7., 9., 10., 11., 13., 14., 15., 16., 17., 18., 19., 20., 22.]])\n",
    "test = enc.transform(test_arr.reshape(-1,1)).toarray()\n",
    "\n",
    "output = []\n",
    "for i in range(test.shape[0]):\n",
    "  _, wemb2 = model(torch.from_numpy(test[i]).unsqueeze(0).float())\n",
    "  wemb2 = wemb2[0].detach().cpu().numpy()\n",
    "  output.append(wemb2)\n",
    "\n",
    "\n",
    "docs = ['cat', 'and', 'mice', 'are', 'buddies', 'hole', 'lives', 'in',\\\n",
    "        'house', 'chases', 'catches', 'runs', 'into', 'says', 'bad', \\\n",
    "        'words', 'pals', 'chums', 'stores', 'sleeps']\n",
    "\n",
    "for i in range(0, len(docs)):\n",
    "  print(\"单词 - {} - Embedding嵌入是 {:.3} & {:.3}\".format(docs[i], output[i][0], output[i][0]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "ZtWBY1gReJT6",
    "outputId": "51109e36-ff7f-4ec1-8fac-15020633f13f"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[array([ 0.4243552, -0.4960522], dtype=float32), array([ 1.5751562, -1.7061585], dtype=float32), array([ 0.42198753, -0.48818663], dtype=float32), array([ 1.6248484, -1.7120342], dtype=float32), array([ 1.6102108, -1.710264 ], dtype=float32), array([1.7342484 , 0.97627646], dtype=float32), array([ 0.83782345, -0.34067658], dtype=float32), array([ 0.80470705, -0.36845478], dtype=float32), array([-0.20722231, -0.47750807], dtype=float32), array([-0.028628 , -0.2924792], dtype=float32), array([-0.24489897,  0.46346688], dtype=float32), array([-1.1793382, -1.8560148], dtype=float32), array([ 0.3750433, -2.05056  ], dtype=float32), array([ 0.40539396, -2.0466785 ], dtype=float32), array([ 2.4336305, -0.4459193], dtype=float32), array([ 1.9220703 , -0.35468408], dtype=float32), array([ 1.374293  , -0.11041691], dtype=float32), array([2.7555737 , 0.97905445], dtype=float32), array([ 2.2184682 , -0.47432426], dtype=float32), array([ 2.2126353 , -0.47340295], dtype=float32)]\n"
     ]
    }
   ],
   "source": [
    "print(output)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "gyfgU2jmfDuz"
   },
   "source": [
    "# 训练embedding之后"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 718
    },
    "execution": {
     "iopub.execute_input": "2024-10-29T02:13:10.502223Z",
     "iopub.status.busy": "2024-10-29T02:13:10.501912Z",
     "iopub.status.idle": "2024-10-29T02:13:10.755140Z",
     "shell.execute_reply": "2024-10-29T02:13:10.754663Z",
     "shell.execute_reply.started": "2024-10-29T02:13:10.502204Z"
    },
    "id": "XThi4elxd4ZR",
    "outputId": "33b783ba-adac-42dd-de4d-00d67317bf12",
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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68PV1RXp6enYs2cP1q1bhyVLlujzMYiIiIiIiIpWMtajRw8kJSVh4sSJiI+PR506dbBv3z7lph4PHjyAWPy/wb7Xr18jMDAQDx8+hImJCapVq4b169ejR48e+noEIiIiIiIiAEUsGQOAoKAgBAUF5XruyJEjKsdTpkzBlClTdBAVERERERGRZorMmjEiIiIiIqLihMkYERERERGRHjAZIyIiIiIi0gMmY0RERERERHrAZIyIiIiIiEgPmIwRERERERHpAZMxIiIiIiIiPWAyRkREREREpAdMxoiIiIiIiPSAyRgREREREZEeMBkjIiIiIiLSAyZjREREREREesBkjIiIiIiISA+YjBEREREREekBkzEiIiIiIiI9YDJGRERERESkB0zGiIiIiIiI9IDJGBERERERkR4wGSMiIiIiItIDJmNERERERER6wGSMiIiIiIhID5iMERERERER6QGTMSIiIiIiIj1gMkZERERERKQHTMaIiIiIiIj0gMkYERERERGRHjAZIyIq4l6/fq3vEIiIiOgTMBkjIioE4uLiEBgYiKpVq8LExATW1tbo1q0bYmNjVeqtWbMGIpEIf/31FwIDA2FnZ4dy5copz+/duxceHh4oVaoUzM3N0b59e1y9elXHT0NERET5YaDvAIiICDh79ixOnjyJnj17oly5coiNjcWSJUvg6emJa9euwdTUVKV+YGAgbG1tMXHiROXI2Lp16zBgwAD4+PggIiICaWlpWLJkCZo3b44LFy7A2dlZD09GREREeWEyRkRUCLRv3x5du3ZVKfPz80OTJk3w+++/o1+/firnSpcujYMHD0IikQAAXr16hVGjRmHQoEFYtmyZst6AAQNQtWpVTJs2TaWciIiI9I/TFImICgETExPlnzMzM/Hs2TNUqlQJlpaWiImJUas/ePBgZSIGANHR0UhOTkavXr3w9OlT5ZdEIkGjRo1w+PBhnTwHERER5R9HxoiICoE3b94gPDwcq1evxqNHjyAIgvJcSkqKWn0XFxeV49u3bwMAvvzyy1zbl8lkWoyWiIiItIHJGBFRITBy5EisXr0aY8aMQZMmTWBhYQGRSISePXtCoVCo1X93JA2Ass66devg4OCgVt/AgP/cExERFTb8rzMRUSGwdetWDBgwALNnz1aWvX37FsnJyfm63tXVFQBgZ2cHLy+vggiRiIiItIxr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hIWFGd7e3kb9+vWNuLg44/z5844vvAJwMQzOJwIAAACAo3GHHQAAAACYgDAGAAAAACYgjAEAAACACQhjAAAAAGACwhgAAAAAmIAwBgAAAAAmIIwBAAAAgAkIYwAAAABgAsIYAKDYQkND9cYbb5TZerGxsXrggQfKbD1J2rJli1xcXJSWllam6wIAUNYIYwBQCcXGxsrFxUUuLi7y9PRU48aNNXnyZOXm5ha53Z49ezR06NAyq+PNN9/UwoULy2y9kti3b58efvhh1a5dW97e3mrSpImGDBmiH374wZR6blbFDeALFixQx44dZbFYCMMAUEyEMQCopKKjo3X69GklJydrzJgxSkhI0OzZswucm52dLUkKCAhQ1apVy6yG6tWry8/Pr8zWK66VK1eqTZs2ysrK0pIlS5SUlKS///3vql69usaPH+/weiqCS5cuKTo6Wi+//LLZpQCA0yCMAUAl5eXlpaCgIDVo0EBPP/20unTpohUrVkj63+WDr7zyiurWratmzZpJyn+WxMXFRe+//74efPBBVa1aVU2aNLGtccXBgwd13333yWKxyNfXV1FRUfrpp5/s9nNFx44dFR8fr/j4eFWvXl21atXS+PHjZRiGbc7ixYvVunVr+fr6KigoSP3799eZM2eKfdyXLl3Sk08+qZiYGK1YsUJdunRRw4YNFRkZqTlz5ujdd9+1zf3Pf/6ju+66S15eXqpTp47Gjh1rd/awY8eOGjlypJ599ln5+/urdu3aeu+993Tx4kU9+eST8vX1VePGjbVmzRrbNlcuo1y1apVuu+02eXt7q02bNjpw4IBdnf/617906623ysvLS6GhoXr11Vft3g8NDdW0adP01FNPydfXVyEhIVqwYIHdnJ9//ll9+/aVn5+fatSood69e+vYsWO296/0f86cOapTp45q1qypESNGKCcnx3Z8x48f13PPPWc7k1qYZ599VmPHjlWbNm2K/d8CACo7whgAQJJUpUoV2xkwSdq4caMOHz6sxMRErVy5stDtJk2apL59++q///2vYmJiNGDAAJ07d06SdPLkSd1zzz3y8vLSpk2btHfvXj311FNFXg65aNEiubu7a/fu3XrzzTf12muv6f3337e9n5OToylTpujbb7/V559/rmPHjik2NrbYx7lu3TqlpqbqxRdfLPD9K2fqTp48qZiYGP3f//2fvv32W82fP18ffPCBpk6dmq/eWrVqaffu3Ro5cqSefvppPfzww2rXrp2++eYbdevWTY8//rguXbpkt90LL7ygV199VXv27FFAQIB69eplC0F79+5V37591a9fP3333XdKSEjQ+PHj813S+eqrr6p169bat2+f4uLi9PTTT+vw4cO2PnXv3l2+vr766quvtG3bNvn4+Cg6Otruv/PmzZv1008/afPmzVq0aJEWLlxo289nn32m4OBgTZ48WadPn9bp06eL3WcAQDEYAIBKZ+DAgUbv3r0NwzAMq9VqJCYmGl5eXsbzzz9ve7927dpGVlaW3XYNGjQwXn/9ddtrSca4ceNsrzMzMw1Jxpo1awzDMIyXXnrJaNiwoZGdnX3dOgzDMDp06GCEh4cbVqvVNvbnP//ZCA8PL/RY9uzZY0gyLly4YBiGYWzevNmQZJw/f77A+TNnzjQkGefOnSt0TcMwjJdfftlo1qyZXS1vv/224ePjY+Tl5dnqvfvuu23v5+bmGtWqVTMef/xx29jp06cNScaOHTvs6lu6dKltztmzZ40qVaoYn3zyiWEYhtG/f3+ja9eudvW88MILxi233GJ73aBBA+Oxxx6zvbZarUZgYKAxf/58wzAMY/Hixfnqz8rKMqpUqWKsW7fOMIzL/W/QoIGRm5trm/Pwww8bjzzyiN1+rv5vfj3X6z8A4H84MwYAldTKlSvl4+Mjb29v9ejRQ4888ogSEhJs77ds2VKenp7XXee2226z/blatWqyWCy2ywb379+vqKgoeXh4FLuuNm3a2F0O17ZtWyUnJysvL0/S5bNGvXr1UkhIiHx9fdWhQwdJ0okTJ4q1vnHVJY9FSUpKUtu2be1qad++vTIzM/XLL7/Yxq4+fjc3N9WsWVMtW7a0jdWuXVuS8l1K2bZtW9ufa9SooWbNmikpKcm27/bt29vNb9++vV0frt23i4uLgoKCbPv59ttv9eOPP8rX11c+Pj7y8fFRjRo19Mcff9guE5WkW2+9VW5ubrbXderUKdFlnwCA0nM3uwAAgDnuvfdezZ8/X56enqpbt67c3e1/JFSrVq1Y61wbtFxcXGS1WiVdvvSxLF28eFHdu3dX9+7dtWTJEgUEBOjEiRPq3r273aV3RWnatKkk6dChQ3aBqLQKOv6rx66EuSs9KUtF9T4zM1MRERFasmRJvu0CAgKKtQYAoHxxZgwAKqlq1aqpcePGCgkJyRfEysptt92mr776ynYvVHHs2rXL7vXOnTvVpEkTubm56dChQzp79qxmzJihqKgoNW/evMRncbp166ZatWpp1qxZBb5/5ZHs4eHh2rFjh92ZtG3btsnX11fBwcEl2mdBdu7cafvz+fPn9cMPPyg8PNy2723bttnN37Ztm5o2bWp3Fqsod955p5KTkxUYGKjGjRvbfVWvXr3YdXp6etqdjQMAlB3CGACg3MTHxysjI0P9+vXT119/reTkZC1evNj2kImCnDhxQqNHj9bhw4f1j3/8Q3PnztUzzzwjSQoJCZGnp6fmzp2rI0eOaMWKFZoyZUqJaqpWrZref/99rVq1Svfff782bNigY8eO6euvv9aLL76o4cOHS5Li4uL0888/a+TIkTp06JD+/e9/a+LEiRo9erRcXW/8x+fkyZO1ceNGHThwQLGxsapVq5btyZJjxozRxo0bNWXKFP3www9atGiR/vrXv+r5558v9voDBgxQrVq11Lt3b3311Vc6evSotmzZolGjRtldZnk9oaGh+vLLL3Xy5EmlpqYWOi8lJUX79+/Xjz/+KEn67rvvtH//ftvDXAAA+RHGAADlpmbNmtq0aZMyMzPVoUMHRURE6L333ivyHrInnnhCv//+u+666y6NGDFCzzzzjO2DpgMCArRw4UItW7ZMt9xyi2bMmKE5c+aUuK7evXtr+/bt8vDwUP/+/dW8eXM9+uijSk9Ptz0tsV69elq9erV2796tVq1aafjw4Ro0aJDGjRtXumZcY8aMGXrmmWcUERGhlJQUffHFF7Z79O688059+umnWrp0qVq0aKEJEyZo8uTJJXpqZNWqVfXll18qJCREDz30kMLDwzVo0CD98ccfslgsxV5n8uTJOnbsmMLCwuwub7zWO++8ozvuuENDhgyRJN1zzz2644478n3UAQDgf1yM4t7JDABAOevYsaNuv/12u88yq2i2bNmie++9V+fPnzflA68BADcPzowBAAAAgAkIYwAAAABgAi5TBAAAAAATcGYMAAAAAExAGAMAAAAAExDGAAAAAMAEhDEAAAAAMAFhDAAAAABMQBgDAAAAABMQxgAAAADABIQxAAAAADDB/wO/ZGDVxUfQcwAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1000x800 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import torch\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.decomposition import PCA\n",
    "\n",
    "# 示例单词列表\n",
    "docs = ['cat', 'and', 'mice', 'are', 'buddies', 'hole', 'lives', 'in',\n",
    "        'house', 'chases', 'catches', 'runs', 'into', 'says', 'bad',\n",
    "        'words', 'pals', 'chums', 'stores', 'sleeps']\n",
    "\n",
    "# 模拟独热编码和转换为嵌入\n",
    "# 使用提供的代码生成嵌入\n",
    "encoded_docs = [one_hot_map(d) for d in docs]  # 假设 `one_hot_map` 是预定义的\n",
    "\n",
    "test_arr = np.array([[1., 2., 3., 4., 5., 8., 6., 7., 9., 10., 11., 13., 14., 15., 16., 17., 18., 19., 20., 22.]])\n",
    "test = enc.transform(test_arr.reshape(-1, 1)).toarray()  # 假设 `enc` 是预定义的\n",
    "\n",
    "output = []\n",
    "for i in range(test.shape[0]):\n",
    "    _, wemb2 = model(torch.from_numpy(test[i]).unsqueeze(0).float())  # 假设 `model` 是预定义的\n",
    "    wemb2 = wemb2[0].detach().cpu().numpy()\n",
    "    output.append(wemb2)\n",
    "\n",
    "# 将输出列表转换为 numpy 数组\n",
    "embeddings = np.array(output)\n",
    "\n",
    "# 执行PCA以将维度减少到2D以便可视化\n",
    "pca = PCA(n_components=2)\n",
    "reduced_embeddings = pca.fit_transform(embeddings)\n",
    "\n",
    "# 绘制二维嵌入\n",
    "plt.figure(figsize=(10, 8))\n",
    "for i, word in enumerate(docs):\n",
    "    plt.scatter(reduced_embeddings[i, 0], reduced_embeddings[i, 1], marker='o')\n",
    "    plt.text(reduced_embeddings[i, 0] + 0.01, reduced_embeddings[i, 1] + 0.01, word, fontsize=12)\n",
    "\n",
    "plt.title(\"词嵌入的二维可视化\")\n",
    "plt.xlabel(\"主成分 1\")\n",
    "plt.ylabel(\"主成分 2\")\n",
    "plt.grid(True)\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
